/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.bc;

import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.tesoreria.be.EnumEstadoMovimiento;
import org.cip.esymons.tesoreria.be.EnumPorcentajeOMoneda;
import org.cip.esymons.tesoreria.be.EnumTipoDescuento;
import org.cip.esymons.tesoreria.be.EnumTipoGeneracionExoneracion;
import org.cip.esymons.tesoreria.be.ExoneracionDescuento;
import org.cip.esymons.tesoreria.be.MovimientoCuenta;
import org.cip.esymons.tesoreria.be.MovimientoExoneradescuento;

/**
 *
 * @author Gilmar Montoya
 */
public class DescuentoConcreto implements DescuentoInterfaz {

    @Override
    public ExoneracionDescuento generarDescuento(EntityManager em, List<MovimientoCuenta> listaMovimientos, Colegiado colegiado, Double descuento, EnumPorcentajeOMoneda enumPorcentajeOMoneda, EnumTipoDescuento enumTipoDescuento, String desc, Date fechaIni, Date fechaFin, EnumTipoGeneracionExoneracion enumTipoGeneracionExoneracion) {
        ExoneracionDescuento exoneracionDescuento = new ExoneracionDescuento();
        exoneracionDescuento.setFkSolCodigocol(colegiado);
        exoneracionDescuento.setTipoGeneracionExoneracion(enumTipoGeneracionExoneracion);
        exoneracionDescuento.setEdeTipo(enumTipoDescuento);
        exoneracionDescuento.setEdeDesc(desc);
        exoneracionDescuento.setEdePorcentaje(descuento);
        exoneracionDescuento.setEdeFechinicio(fechaIni);
        exoneracionDescuento.setEdeFechfin(fechaFin);
        exoneracionDescuento.setPorcentajeOMoneda(enumPorcentajeOMoneda);
        em.persist(exoneracionDescuento);
        if (listaMovimientos != null) {
            generarDetalle(em, exoneracionDescuento, listaMovimientos, descuento, enumPorcentajeOMoneda);
        }
        return exoneracionDescuento;
    }

    private void generarDetalle(EntityManager em, ExoneracionDescuento exoneracionDescuento, List<MovimientoCuenta> listaMovimientos, double descuento, EnumPorcentajeOMoneda enumPorcentajeOMoneda) {
        for (MovimientoCuenta mc : listaMovimientos) {
            if (mc.getFkCinCodigo().isAfectoDescuentoPagoAnual()) {
                MovimientoExoneradescuento movimientoExoneradescuento = new MovimientoExoneradescuento();
                movimientoExoneradescuento.setExoneracionDescuento(exoneracionDescuento);
                if (enumPorcentajeOMoneda.equals(EnumPorcentajeOMoneda.Moneda)) {
                    movimientoExoneradescuento.setMedMontodescuento(descuento);
                    mc.setMcuMonto(mc.getMcuMonto() - descuento);
                } else {
                    movimientoExoneradescuento.setMedMontodescuento(mc.getMcuMonto() * (descuento / 100));
                    mc.setMcuMonto(mc.getMcuMonto() - movimientoExoneradescuento.getMedMontodescuento());
                }
                mc.setMcuSaldo(mc.getMcuMonto());
                if (mc.getMcuSaldo() <= 0) {
                    mc.setEstado(EnumEstadoMovimiento.Exonerada);
                }
                em.merge(mc);
                movimientoExoneradescuento.setMovimientoCuenta(mc);
                em.persist(movimientoExoneradescuento);
            }
        }

    }

    public void generarDetalleParaExoneracion(EntityManager em, ExoneracionDescuento exoneracionDescuento, List<MovimientoCuenta> listaMovimientos, double descuento, EnumPorcentajeOMoneda enumPorcentajeOMoneda) {
        generarDetalle(em, exoneracionDescuento, listaMovimientos, descuento, enumPorcentajeOMoneda);
    }
}
